package valid

import (
	"strings"
)

// IsLetter 字符串是否为纯字母（大小写字母）
// 长度不限制，最少一个字母
func IsLetter(val string) bool {
	return IsLetterWith(val, 0, 0, 0)
}

// IsLetterLower 字符串是否为纯字母（小写）
// 仅允许小写字母，长度不限制，最少一个字母
func IsLetterLower(val string) bool {
	return IsLetterWith(val, 1, 0, 0)
}

// IsLetterUpper 字符串是否为纯字母（大写）
// 仅允许大写字母，长度不限制，最少一个字母
func IsLetterUpper(val string) bool {
	return IsLetterWith(val, 2, 0, 0)
}

// IsLetterWith 字符串是否为纯字母、数字
//   - val 字符串
//   - alpha 0 允许大小写 1 进允许小写 2 仅允许大写
//   - number 0 不允许数字 1 允许数字(任意位置) 2允许数字（限制为不允许数字开头）
//   - length 字符串长度 0/不限制
//   - symbols 字符串中允许的使用的其他ASCII字符符号，如_-连字符（限制为不允许连字符开头及结尾，不允许连续多个，仅允许出现在字符串中间）

func IsLetterWith(val string, alpha int, number int, length int, symbols ...string) bool {
	if val == "" {
		return false
	}
	// ASCII 65---90  A-Z
	// ASCII 97---122 a-z
	// ASCII 48---57  0---9
	//遍历每一个ASCII字符
	l := len(val)
	if l < 1 {
		return false
	}
	if length > 0 && length != l {
		return false
	}
	//允许数字（限制为不允许数字开头）
	if number == 2 {
		if val[0] >= 48 && val[0] <= 57 {
			return false
		}
	}
	i := 0
	strSymbol := ""
	lenSymbol := 0
	isSymbol := false //上一个字符是否是连字符
	if len(symbols) > 0 {
		strSymbol = strings.Join(symbols, "")
		lenSymbol = len(strSymbol)
	}
	//不允许连字符开头或结尾
	if lenSymbol > 0 {
		for j := range lenSymbol {
			if val[0] == strSymbol[j] || val[l-1] == strSymbol[j] {
				return false
			}
		}
	}

	for ; i < l; i++ {
	Loop:
		if number > 0 {
			if val[i] >= 48 && val[i] <= 57 {
				isSymbol = false
				continue
			}
		}
		if lenSymbol > 0 {
			for j := range lenSymbol {
				if val[i] == strSymbol[j] {
					if isSymbol {
						//不允许连续多个
						return false
					}
					isSymbol = true
					i++
					if i < l {
						goto Loop
					}
					//不允许连字符在结尾
					return false
				}
			}
			isSymbol = false
		}
		if alpha == 0 {
			// ASCII 65---90  A-Z
			// ASCII 97---122 a-z
			// 允许大小写
			if val[i] < 65 || val[i] > 122 {
				return false
			}
			if val[i] > 90 && val[i] < 97 {
				return false
			}
		} else if alpha == 1 {
			// ASCII 97---122 a-z
			// 仅允许小写字母
			if val[i] < 97 || val[i] > 122 {
				return false
			}
		} else if alpha == 2 {
			// ASCII 65---90  A-Z
			// 仅允许大写字母
			if val[i] < 65 || val[i] > 90 {
				return false
			}
		}
		isSymbol = false
	}

	//长度相符（不含有特殊字符）
	return l == i
}
